package ar.com.uade.administradorsiembra.controladores;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import ar.com.uade.administradorsiembra.modelo.Lote;
import ar.com.uade.administradorsiembra.modelo.LoteCompuesto;
import ar.com.uade.administradorsiembra.modelo.Mineral;
import ar.com.uade.administradorsiembra.modelo.Propietario;
import ar.com.uade.administradorsiembra.modelo.exceptions.LoteInexistenteException;
import ar.com.uade.administradorsiembra.modelo.exceptions.PropietarioInexcstenteException;
import ar.com.uade.administradorsiembra.persistencia.LoteMapper;
import ar.com.uade.administradorsiembra.persistencia.MineralMapper;
import ar.com.uade.administradorsiembra.persistencia.PropietarioMapper;
import ar.com.uade.administradorsiembra.views.LoteCompuestoView;
import ar.com.uade.administradorsiembra.views.LoteView;
import ar.com.uade.administradorsiembra.views.MineralView;
import ar.com.uade.administradorsiembra.views.PropietarioView;

public class ABMLoteCompuestoController {
	private static ABMLoteCompuestoController controller;
	private PropietarioMapper propietarioMapper;
	private LoteMapper loteMapper;
	
	private MineralMapper mineralMapper;
	
	private ABMLoteCompuestoController(){	
	}
	
	private PropietarioMapper getPropietarioMapper(){
		if(propietarioMapper == null){
			propietarioMapper = new PropietarioMapper();
		}
		
		return propietarioMapper;
	}
	
	private LoteMapper getLoteMapper(){
		if(loteMapper == null){
			loteMapper = new LoteMapper();
		}
		
		return loteMapper;
	}
	private MineralMapper getMineralMapper(){
		if(mineralMapper == null){
			mineralMapper = new MineralMapper();
		}
		
		return mineralMapper;
	}
	
	public static ABMLoteCompuestoController getInstancia(){
		if(controller == null) {
			controller = new ABMLoteCompuestoController();
		}
		
		return controller;
	}
	
	public void crearLoteCompuesto(Integer numeroLote, List<LoteView> numLotes,
			Integer dniPropietario) throws PropietarioInexcstenteException,
			LoteInexistenteException {

		Lote lote = null;
		Propietario propietario = getPropietarioMapper()
				.buscarPorDni(dniPropietario);

		if (propietario != null) {
			LoteCompuesto loteCompuesto = new LoteCompuesto(numeroLote);
			for (LoteView loteView : numLotes) {
				lote = getLoteMapper().buscarPorId(loteView.getId());
				if (lote == null) {
					throw new LoteInexistenteException();
				}
				loteCompuesto.agregarLote(lote);
			}

		} else {
			throw new PropietarioInexcstenteException();
		}
	}

	public void modificarLoteCompuesto(
		Integer numeroLote, List<Integer> numLotes,
		Integer dniPropietario ) throws PropietarioInexcstenteException,
		LoteInexistenteException {

		Lote lote = null;
		Propietario propietario = getPropietarioMapper()
				.buscarPorDni(dniPropietario);
		
		if (propietario != null) {
			LoteCompuesto loteCompuesto = getLoteMapper().buscarLoteCompuestoPorId(numeroLote);
			
			loteCompuesto.borrarLotes();
			
			for (Integer integer : numLotes) {
				lote = getLoteMapper().buscarPorId(integer);
				if (lote == null) {
					throw new LoteInexistenteException();
				}
				
				loteCompuesto.agregarLote(lote);
			}
			
			getLoteMapper().modificar(loteCompuesto);
		} else {
			throw new PropietarioInexcstenteException();
		}
	}
	public List<LoteView> getLotes(){
		List<LoteView> lotes = new LinkedList<LoteView>();
		
		for (Lote lote : this.getLoteMapper().buscarTodos()) {			
			lotes.add(lote.getView());			
		}
		
		return lotes;
	}
	public List<PropietarioView> getPropietarios(){
		List<PropietarioView> propViews = new LinkedList<PropietarioView>();
		List<Propietario> propietarios = this.getPropietarioMapper().buscarTodos();
		for (Propietario prop : propietarios) {
			propViews.add(prop.getView());
		}
		return propViews;
	}

	public List<MineralView> getMinerales() {
		List<MineralView> mineralViews = new LinkedList<MineralView>();
		List<Mineral> minerales = this.getMineralMapper().buscarTodos();
		for (Mineral mineral : minerales) {
			
			mineralViews.add(mineral.getView());
		}
		return mineralViews;
	}

	public List<LoteCompuestoView> getLotesCompuestos() {
		// TODO Auto-generated method stub
		List<LoteCompuesto> lotesCompuestos = this.getLoteMapper().buscarTodosLotesCompuestos();
		List<LoteCompuestoView> lotesCompuestosView = new ArrayList<LoteCompuestoView>();
		
		for (LoteCompuesto loteCompuesto : lotesCompuestos) {
			lotesCompuestosView.add(loteCompuesto.getLoteCompuestoView());
		}
		
		return lotesCompuestosView;
	}

}
